{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cdb60095",
   "metadata": {},
   "source": [
    "# MLP实验（MNIST & CIFAR-10）\n",
    "\n",
    "本实验将使用多层感知机（MLP）模型对MNIST和CIFAR-10数据集进行分类任务，分析其表现并进行可视化。"
   ]
  },
  {
   "cell_type": "code",
   "id": "75b495dc",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:41:42.409229Z",
     "start_time": "2025-05-22T14:41:38.239027Z"
    }
   },
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import accuracy_score, confusion_matrix\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "cell_type": "markdown",
   "id": "9444196b",
   "metadata": {},
   "source": [
    "## 加载数据集"
   ]
  },
  {
   "cell_type": "code",
   "id": "ff683bd7",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:41:43.809429Z",
     "start_time": "2025-05-22T14:41:42.519471Z"
    }
   },
   "source": [
    "def load_mnist():\n",
    "    transform = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.5,), (0.5,))\n",
    "    ])\n",
    "    trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)\n",
    "    testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)\n",
    "    return trainset, testset\n",
    "\n",
    "def load_cifar10():\n",
    "    transform = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n",
    "    ])\n",
    "    trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)\n",
    "    testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)\n",
    "    return trainset, testset\n",
    "\n",
    "def dataset_to_numpy(dataset, flatten=True):\n",
    "    X = []\n",
    "    y = []\n",
    "    for img, label in dataset:\n",
    "        arr = img.numpy()\n",
    "        if flatten:\n",
    "            arr = arr.flatten()\n",
    "        else:\n",
    "            arr = arr.transpose(1, 2, 0)\n",
    "        X.append(arr)\n",
    "        y.append(label)\n",
    "    X = np.array(X)\n",
    "    y = np.array(y)\n",
    "    return X, y\n",
    "\n",
    "mnist_train, mnist_test = load_mnist()\n",
    "cifar_train, cifar_test = load_cifar10()\n",
    "print(f\"MNIST训练集样本数: {len(mnist_train)}，测试集样本数: {len(mnist_test)}\")\n",
    "print(f\"CIFAR-10训练集样本数: {len(cifar_train)}，测试集样本数: {len(cifar_test)}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST训练集样本数: 60000，测试集样本数: 10000\n",
      "CIFAR-10训练集样本数: 50000，测试集样本数: 10000\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "cell_type": "markdown",
   "id": "0599ee36",
   "metadata": {},
   "source": [
    "## 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "id": "4d720ec7",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:41:54.532094Z",
     "start_time": "2025-05-22T14:41:43.811942Z"
    }
   },
   "source": [
    "# MNIST\n",
    "X_train_m, y_train_m = dataset_to_numpy(mnist_train)\n",
    "X_test_m, y_test_m = dataset_to_numpy(mnist_test)\n",
    "# CIFAR-10\n",
    "X_train_c, y_train_c = dataset_to_numpy(cifar_train)\n",
    "X_test_c, y_test_c = dataset_to_numpy(cifar_test)\n",
    "# 只取部分样本\n",
    "n_samples = 2000  # MLP较慢，减少样本数\n",
    "X_train_m, y_train_m = X_train_m[:n_samples], y_train_m[:n_samples]\n",
    "X_test_m, y_test_m = X_test_m[:500], y_test_m[:500]\n",
    "X_train_c, y_train_c = X_train_c[:n_samples], y_train_c[:n_samples]\n",
    "X_test_c, y_test_c = X_test_c[:500], y_test_c[:500]\n",
    "# 标准化\n",
    "scaler_m = StandardScaler().fit(X_train_m)\n",
    "X_train_m = scaler_m.transform(X_train_m)\n",
    "X_test_m = scaler_m.transform(X_test_m)\n",
    "scaler_c = StandardScaler().fit(X_train_c)\n",
    "X_train_c = scaler_c.transform(X_train_c)\n",
    "X_test_c = scaler_c.transform(X_test_c)"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "markdown",
   "id": "7e28264d",
   "metadata": {},
   "source": [
    "## MLP模型训练与评估"
   ]
  },
  {
   "cell_type": "code",
   "id": "3ecb1abe",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:41:56.482857Z",
     "start_time": "2025-05-22T14:41:54.543175Z"
    }
   },
   "source": [
    "def train_and_evaluate(model, X_train, y_train, X_test, y_test):\n",
    "    model.fit(X_train, y_train)\n",
    "    y_pred = model.predict(X_test)\n",
    "    acc = accuracy_score(y_test, y_pred)\n",
    "    cm = confusion_matrix(y_test, y_pred)\n",
    "    return acc, cm, y_pred\n",
    "\n",
    "# MNIST\n",
    "mlp_mnist = MLPClassifier(max_iter=20)\n",
    "acc_m, cm_m, y_pred_m = train_and_evaluate(mlp_mnist, X_train_m, y_train_m, X_test_m, y_test_m)\n",
    "print(f\"MNIST MLP准确率: {acc_m:.3f}\")\n",
    "# CIFAR-10\n",
    "mlp_cifar = MLPClassifier(max_iter=20)\n",
    "acc_c, cm_c, y_pred_c = train_and_evaluate(mlp_cifar, X_train_c, y_train_c, X_test_c, y_test_c)\n",
    "print(f\"CIFAR-10 MLP准确率: {acc_c:.3f}\")"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\machineLearning\\venv\\Lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (20) reached and the optimization hasn't converged yet.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MNIST MLP准确率: 0.896\n",
      "CIFAR-10 MLP准确率: 0.354\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\machineLearning\\venv\\Lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (20) reached and the optimization hasn't converged yet.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "cell_type": "markdown",
   "id": "3175b8f8",
   "metadata": {},
   "source": [
    "## 可视化分析"
   ]
  },
  {
   "cell_type": "code",
   "id": "0902124a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-22T14:41:56.678459Z",
     "start_time": "2025-05-22T14:41:56.492493Z"
    }
   },
   "source": [
    "# 准确率柱状图\n",
    "plt.figure(figsize=(5,4))\n",
    "plt.bar(['MNIST', 'CIFAR-10'], [acc_m, acc_c])\n",
    "plt.ylabel('Accuracy')\n",
    "plt.title('MLP在不同数据集上的准确率')\n",
    "plt.show()\n",
    "# 混淆矩阵\n",
    "fig, axes = plt.subplots(1,2, figsize=(12,5))\n",
    "axes[0].imshow(cm_m, cmap=plt.cm.Blues)\n",
    "axes[0].set_title('MNIST 混淆矩阵')\n",
    "axes[1].imshow(cm_c, cmap=plt.cm.Blues)\n",
    "axes[1].set_title('CIFAR-10 混淆矩阵')\n",
    "for ax in axes:\n",
    "    ax.set_xlabel('Predicted')\n",
    "    ax.set_ylabel('True')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22312 (\\N{CJK UNIFIED IDEOGRAPH-5728}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19981 (\\N{CJK UNIFIED IDEOGRAPH-4E0D}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21516 (\\N{CJK UNIFIED IDEOGRAPH-540C}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 25968 (\\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 25454 (\\N{CJK UNIFIED IDEOGRAPH-636E}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38598 (\\N{CJK UNIFIED IDEOGRAPH-96C6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 19978 (\\N{CJK UNIFIED IDEOGRAPH-4E0A}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20934 (\\N{CJK UNIFIED IDEOGRAPH-51C6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30830 (\\N{CJK UNIFIED IDEOGRAPH-786E}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 29575 (\\N{CJK UNIFIED IDEOGRAPH-7387}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 500x400 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcoAAAF2CAYAAADulNjSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAHtdJREFUeJzt3Qt4zfcdx/Gva9wpISrShVVdSlH3lnZbXepaVkWqdamxupTSbu7MZW4zVN1GBWsFo3is1KY0VaQyUqqr2NRUqEgyE4RKJNnz/e05WSInP4mc5CTnvF/P83/k/PP/n/OLJyef87sXSU1NTRUAAOBUUeenAQCAIigBALAgKAEAsCAoAQCwICgBALAgKAEAsCAoAQCwICgBALAgKAEAsCAoAQCwICjh8davXy9FihQxx6FDhzJ9X1dxDAgIMN/v1q1b2nl9PGrUKOtz/+QnP0l7bj0qV64sLVq0kODgYElJScmTnwdA/iIo4TVKlSolISEhmc5/9tlncvHiRfHx8Xmg561Zs6a8//775pg6darcvXtXhgwZIpMmTTLfX7FihXntcuXKOT0CAwO5rgBeBzgQlPAaXbp0ka1bt5ogS0/Ds1mzZlK9evUHet6KFSvKK6+8Yo6xY8fK4cOHTXguW7ZMkpKSTM3y7bfflps3b2Y64uLi0srDdQXrOsCBoITXCAoKkn//+9+yb9++tHOJiYmybds2efnll132OmXKlJHWrVtLQkKCxMbGuux5AbgHQQmvoU1qbdq0kU2bNqWd+/jjjyU+Pl769evn0tc6d+6cFCtWTCpVquTS5wWQ/whKeBWtOe7cuVNu375tHm/cuFGeffZZqVGjxgM/Z3Jysmmy0yMyMlLGjBkjERERpqlXa5cACjeCEl6lT58+JiQ/+ugjuXHjhvk3t82uGo5Vq1Y1R/369eXdd9+Vrl27mpGvAAq/4u4uAJCfNMzat29vBvDcunXL1AZ79+6d6ybdNWvWmOkhOpqyTp06Uq1aNZeVGYB7EZTwOlqDHDp0qERHR0vnzp1z3Y9YtmxZE74APBNNr/A6vXr1kqJFi8oXX3zh0tGuADwTNUp4HZ1UvnLlSjl//rx0797d3cUBUMARlPBKAwcOzNZ1x44dk9mzZztduq5t27Z5UDIABQ1BCVgcPXrUHPeaNWsWQQl4CYISHm/QoEHmuB9tir13sfT7CQ0NzVXZABR8DOYBAMCCoATywcKFC800lHuPexdi57qCdR2giqRmp30JAAAvRY0SAAALghIAAAuCEgAAC6+bHqK7m3///fdSvnx5s4g1AMA7paamml2EdJs9XdYyK14XlBqSAQEB7i4GAKCAiIqKkpo1a2b5fa8LSq1JOv5jKlSo4O7iAADc5Pr166bi5MiFrHhdUDqaWzUkCUoAQJH7dMMxmAcAAAuCEgAAC4ISAAALghIAAAuCEgAAC4ISAAALghIAAAuCEgAAC4ISAAALghIAAAuCEgAAC4ISAAALr1sU3ZUCJ+x2dxHgRc7P6+ruIgBeiRolAAAWBCUAABYEJQAAFgQlAAAWBCUAABYEJQAAFgQlAAAWBCUAABYEJQAAFgQlAAAWBCUAABYEJQAAFgQlAAAWBCUAABYEJQAAFgQlAAAWBCUAABYEJQAAFgQlAAAWBCUAABYEJQAAFgQlAAAWBCUAABYEJQAAFgQlAAAWBCUAAAU5KJcvXy6BgYFSqlQpadWqlYSHh1uvX7JkidStW1dKly4tAQEBMnbsWPnhhx/yrbwAAO/i1qDcsmWLjBs3TqZPny4RERHSuHFj6dSpk8TExDi9PiQkRCZMmGCuP336tKxdu9Y8x6RJk/K97AAA7+DWoFy0aJEMHTpUBg8eLA0aNJBVq1ZJmTJlJDg42On1R44ckaefflpefvllUwvt2LGjBAUF3bcWCgBAoQvKxMREOX78uLRv3/7/hSla1DwOCwtzes9TTz1l7nEE47lz52TPnj3SpUuXLF/nzp07cv369QwHAADZVVzcJC4uTpKTk8XPzy/DeX0cGRnp9B6tSep9bdu2ldTUVLl79668/vrr1qbXuXPnyowZM1xefgCAd3D7YJ6cCA0NlTlz5siKFStMn+b27dtl9+7dMmvWrCzvmThxosTHx6cdUVFR+VpmAEDh5rYapa+vrxQrVkyuXLmS4bw+rl69utN7pk6dKq+++qr84he/MI8bNWokCQkJMmzYMJk8ebJpur2Xj4+POQAAKFQ1ypIlS0qzZs1k//79aedSUlLM4zZt2ji959atW5nCUMNWaVMsAAAeU6NUOjVk4MCB0rx5c2nZsqWZI6k1RB0FqwYMGCD+/v6mn1F1797djJRt2rSpmXN59uxZU8vU847ABADAY4Kyb9++EhsbK9OmTZPo6Ghp0qSJ7N27N22Az4ULFzLUIKdMmSJFihQx/166dEmqVq1qQvK3v/2tG38KAIAnK5LqZW2WOj2kYsWKZmBPhQoVcvVcgRN2u6xcwP2cn9fV3UUAvDIPCtWoVwAA8htBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAIAFQQkAgAVBCQCABUEJAEBBDsrly5dLYGCglCpVSlq1aiXh4eHW669duyYjR46Uhx9+WHx8fOSxxx6TPXv25Ft5AQDepbg7X3zLli0ybtw4WbVqlQnJJUuWSKdOneTMmTNSrVq1TNcnJiZKhw4dzPe2bdsm/v7+8t1330mlSpXcUn4AgOdza1AuWrRIhg4dKoMHDzaPNTB3794twcHBMmHChEzX6/mrV6/KkSNHpESJEuac1kYBAPC4pletHR4/flzat2///8IULWoeh4WFOb1n165d0qZNG9P06ufnJw0bNpQ5c+ZIcnJyPpYcAOBN3FajjIuLMwGngZeePo6MjHR6z7lz5+TAgQPSv39/0y959uxZGTFihCQlJcn06dOd3nPnzh1zOFy/ft3FPwkAwJO5fTBPTqSkpJj+ydWrV0uzZs2kb9++MnnyZNNkm5W5c+dKxYoV046AgIB8LTMAoHBzW1D6+vpKsWLF5MqVKxnO6+Pq1as7vUdHuuooV73PoX79+hIdHW2acp2ZOHGixMfHpx1RUVEu/kkAAJ7MbUFZsmRJUyvcv39/hhqjPtZ+SGeefvpp09yq1zn84x//MAGqz+eMTiGpUKFChgMAgELR9KpTQ9asWSMbNmyQ06dPy/DhwyUhISFtFOyAAQNMjdBBv6+jXseMGWMCUkfI6mAeHdwDAIDHTQ/RPsbY2FiZNm2aaT5t0qSJ7N27N22Az4ULF8xIWAftX/zLX/4iY8eOlSeeeMLMo9TQHD9+vBt/CgCAJyuSmpqaKl5ER73qoB7tr8xtM2zghN0uKxdwP+fndXV3EQCvzINCNeoVAID8RlACAGBBUAIAYEFQAgBgQVACAGBBUAIAYEFQAgDgyqDU/R9nzpxpFgMAAMDT5Tgo33zzTdm+fbvUrl1bOnToIJs3b86wjRUAAOLtQXnixAkJDw83O3e88cYbZlHyUaNGSURERN6UEgCAwtZH+eSTT8rSpUvl+++/N5smv/fee9KiRQuzXmtwcLB42cp4AAAP9cCLoiclJcmOHTtk3bp1sm/fPmndurUMGTJELl68KJMmTZJPPvlEQkJCXFtaAAAKelBq86qG46ZNm8zOHroV1uLFi6VevXpp1/Tq1cvULgEA8Lqg1ADUQTwrV66Unj17SokSJTJdU6tWLenXr5+ryggAQOEJynPnzsmPfvQj6zVly5Y1tU4AALxuME9MTIwcPXo003k9d+zYMVeVCwCAwhmUI0eOlKioqEznL126ZL4HAIBXB+U333xjpobcq2nTpuZ7AAB4dVD6+PjIlStXMp2/fPmyFC/+wLNNAADwjKDs2LGjTJw4UeLj49POXbt2zcyd1NGwAAB4khxXARcuXCjPPPOMGfmqza1Kl7Tz8/OT999/Py/KCABA4QlKf39/+eqrr2Tjxo1y8uRJKV26tAwePFiCgoKczqkEAKAwe6BORZ0nOWzYMNeXBgCAAuaBR9/oCFfdkzIxMTHD+R49eriiXAAAFN6VeXQt11OnTkmRIkXSdgnRr1VycrLrSwkAQGEZ9TpmzBizlquu0FOmTBn5+9//LgcPHpTmzZtLaGho3pQSAIDCUqMMCwuTAwcOiK+vr9k9RI+2bdvK3LlzZfTo0fLll1/mTUkBACgMNUptWi1fvrz5WsNSN25WOl3kzJkzri8hAACFqUbZsGFDMy1Em19btWolCxYskJIlS8rq1auldu3aeVNKAAAKS1BOmTJFEhISzNczZ86Ubt26Sbt27aRKlSqyZcuWvCgjAACFJyg7deqU9vWjjz4qkZGRcvXqVXnooYfSRr4CAOCVfZRJSUlm4fOvv/46w/nKlSsTkgAAj5SjoNQl6h555BHmSgIAvEaOR71OnjzZ7BSiza0AAHi6HPdRLlu2TM6ePSs1atQwU0J03df0IiIiXFk+AAAKV1D27Nkzb0oCAIAnBOX06dPzpiQAAHhCHyUAAN4kxzVKXdvVNhWEEbEAAK8Oyh07dmSaW6kLoW/YsEFmzJjhyrIBAFD4gvKFF17IdK53797y+OOPmyXshgwZ4qqyAQDgOX2UrVu3lv3797vq6QAA8JygvH37tixdulT8/f1d8XQAABTeptd7Fz9PTU2VGzduSJkyZeSDDz5wdfkAAChcQbl48eIMQamjYKtWrWr2ptQQBQDAq4Ny0KBBeVMSAAA8oY9y3bp1snXr1kzn9ZxOEQEAwKuDcu7cueLr65vpfLVq1WTOnDmuKhcAAIUzKC9cuCC1atXKdF53EtHvAQDg1UGpNcevvvoq0/mTJ09KlSpVXFUuAAAKZ1AGBQXJ6NGj5dNPPzXruupx4MABGTNmjPTr1y9vSgkAQGEZ9Tpr1iw5f/68PPfcc1K8+P9uT0lJkQEDBtBHCQDwODkOypIlS5o1XWfPni0nTpyQ0qVLS6NGjUwfJQAA4u1B6VCnTh1zAADgyXLcR/niiy/K/PnzM51fsGCBvPTSS64qFwAAhTMoDx48KF26dMl0vnPnzuZ7D2L58uUSGBgopUqVMkvhhYeHZ+u+zZs3m+X0evbs+UCvCwCAy4Py5s2bpp/yXiVKlJDr16/n9OlMf+e4ceNk+vTpEhERIY0bN5ZOnTpJTEyM9T4dUPT2229Lu3btcvyaAADkWVDqwB0NN2e1uwYNGuT06WTRokUydOhQGTx4sLl/1apVZieS4ODgLO/RKSn9+/eXGTNmSO3atXP8mgAA5NlgnqlTp8rPf/5z+fbbb+VnP/uZOacbNoeEhMi2bdty9FyJiYly/PhxmThxYobdSNq3by9hYWFZ3jdz5kyz8MGQIUPk888/t77GnTt3zOHwILVeAID3ynFQdu/eXXbu3GnmTGow6vQQbS7VRQcqV66co+eKi4sztUM/P78M5/VxZGSk03sOHToka9euNVNTsrs2rdY8AQDIl6ZX1bVrVzl8+LAkJCTIuXPnpE+fPqa/UAMzL+kG0a+++qqsWbPG6cLszmhtNT4+Pu2IiorK0zICADzLA8+j1BGuWrP78MMPpUaNGqY5Vkev5oSGXbFixeTKlSsZzuvj6tWrZ7pem3t1EI/Wah10VSDzgxQvLmfOnJEf//jHGe7x8fExBwAAeR6U0dHRsn79ehOQ2tenNUnt/9Om2AcZyKOjZ5s1a2b6OB1TPDT49PGoUaMyXV+vXj05depUhnNTpkwxNc133nlHAgICclwGAABcEpRai9NapDa7LlmyRJ5//nlTG9RRqrmhU0MGDhwozZs3l5YtW5rn1iZdHQWrdA1Zf39/09eo8ywbNmyY4f5KlSqZf+89DwBAvgblxx9/bHYNGT58uEuXruvbt6/ExsbKtGnTTI21SZMmsnfv3rQBPrrHpY6EBQCgQAelY7SpNpXWr1/fDKpx1bZa2szqrKlVhYaGWu/VpmAAAPJKtqtqrVu3NqNNL1++LL/85S/NAgM6iEf7FPft22f6CQEA8DQ5btMsW7asvPbaa6aGqQNr3nrrLZk3b55ZAKBHjx55U0oAANwkV51/devWNbuGXLx4UTZt2uS6UgEAUEC4ZJSMjn7V6R27du1yxdMBAFBgMJwUAAALghIAAAuCEgAAC4ISAIC8WBQdANILnLDb3UWAFzk/r2u+vRY1SgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAACwISgAALAhKAAAsCEoAAAp6UC5fvlwCAwOlVKlS0qpVKwkPD8/y2jVr1ki7du3koYceMkf79u2t1wMAUKiDcsuWLTJu3DiZPn26RERESOPGjaVTp04SExPj9PrQ0FAJCgqSTz/9VMLCwiQgIEA6duwoly5dyveyAwA8n9uDctGiRTJ06FAZPHiwNGjQQFatWiVlypSR4OBgp9dv3LhRRowYIU2aNJF69erJe++9JykpKbJ///58LzsAwPO5NSgTExPl+PHjpvk0rUBFi5rHWlvMjlu3bklSUpJUrlw5D0sKAPBWxd354nFxcZKcnCx+fn4ZzuvjyMjIbD3H+PHjpUaNGhnCNr07d+6Yw+H69eu5LDUAwJu4vek1N+bNmyebN2+WHTt2mIFAzsydO1cqVqyYdmifJgAAhSIofX19pVixYnLlypUM5/Vx9erVrfcuXLjQBOVf//pXeeKJJ7K8buLE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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\13306\\AppData\\Local\\Temp\\ipykernel_23084\\2410627482.py:16: UserWarning: Glyph 28151 (\\N{CJK UNIFIED IDEOGRAPH-6DF7}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\13306\\AppData\\Local\\Temp\\ipykernel_23084\\2410627482.py:16: UserWarning: Glyph 28102 (\\N{CJK UNIFIED IDEOGRAPH-6DC6}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\13306\\AppData\\Local\\Temp\\ipykernel_23084\\2410627482.py:16: UserWarning: Glyph 30697 (\\N{CJK UNIFIED IDEOGRAPH-77E9}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "C:\\Users\\13306\\AppData\\Local\\Temp\\ipykernel_23084\\2410627482.py:16: UserWarning: Glyph 38453 (\\N{CJK UNIFIED IDEOGRAPH-9635}) missing from font(s) DejaVu Sans.\n",
      "  plt.tight_layout()\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28151 (\\N{CJK UNIFIED IDEOGRAPH-6DF7}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28102 (\\N{CJK UNIFIED IDEOGRAPH-6DC6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 30697 (\\N{CJK UNIFIED IDEOGRAPH-77E9}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\machineLearning\\venv\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 38453 (\\N{CJK UNIFIED IDEOGRAPH-9635}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABBUAAAHqCAYAAABbfXZsAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAALz1JREFUeJzt3Ql4XVW5N/A3bdq00IEytrVlUqDUMk8C9xaQWUQQBVHQAloFChQQhMqHDAUKKoiCjFeGq5RBuQii4sdlRmaKCF5GUawgk0BH6JR8z9re5GtoS5OVNnuf5vd7nk16ztnnnLebNPvN/6y1dl1TU1NTAAAAALRTt/Y+AQAAACARKgAAAABZhAoAAABAFqECAAAAkEWoAAAAAGQRKgAAAABZhAoAAABAFqECAAAAkEWoAAAAAGQRKgAAAABZhArQBldddVXU1dUV2/3337/A401NTTF06NDi8U9/+tOtHmt+3rnnnrvI133sscda7jv11FOL+956661W+/7qV7+K7bbbLlZdddVYbrnlYu2114799tsvbrvttuLx7bffvuW9PmxLrw8A8GH+/Oc/xze+8Y2i3+jVq1f069cvtt122/jhD38Y7733Xst+a6655iJ7nw9uAwcObLXfu+++W7x2euyZZ55ZaB0HHXRQq9doaGiIddddN77zne/E+++/36a/yyOPPBKHH354bLbZZtGjR4/idT7MT37yk1h//fWL2tZZZ5244IIL2vQ+0FXVl10A1JJ0cpk4cWL827/9W6v777nnnvj73/9enOgW5Xvf+14cdthhRSDQXt///vfj+OOPL0KFcePGFa/x4osvxn//93/HddddF7vttlucdNJJ8bWvfa3lOY8++mj86Ec/im9/+9vFibHZhhtuuND3uOiii+LYY4+N+vqF/1hYeeWV469//Wtp+wEAnePXv/517LvvvkVf85WvfCVGjBgRs2fPLj5YSf3In/70p7jssss+9DV23nnn4rnz6927d6vbP//5z1vChmuuuSbOOOOMhb5WquM//uM/ij9PmTIlbr755hg/fnwRfKTnLc5vfvOb4vmpB0ohyfPPP7/IfS+99NI49NBD43Of+1zRn9x3331x1FFHxcyZM+OEE05Y5PPSMdlkk02iZ8+eC308Hb8UnKQgpIz9PvrRjy6yduiwJmCxrrzyyqb0z2WfffZpWnnllZvmzJnT6vHRo0c3bbbZZk1rrLFG0x577NHqsfS8jTfeuPh67rnnLvR1H3300Zb7TjnllOK+N998s7id3qtfv35NO++880Jre/311xd6/89//vPide666642/R0vuOCCppNOOmmhj7333ntNH/nIR0rdDwBY+l566aWmPn36NA0bNqzp1VdfXeDxF154oen8889vub2o3mfMmDGLfa+RI0cWvdUxxxzTtNZaay10n1GjRjUtv/zyre5rbGxs+sQnPtFUV1fX9Nprry32fdI+M2fOLP6c6lrUr0Bpn5VWWmmBv88BBxxQ1PD2228v8j2eeuqppm233XaRj2+11VbFsStrP1iaTH+AdvjiF78Y//znP+P2229vlQD/4he/iC996UuLfF4aLvjJT34yvvvd77YaMtgWaRrE1KlTi9dYmDQdAgBgSUi9yvTp04spAIMGDVrg8Y997GMxduzYDr/P3/72t2IUwP77719sf/nLX+KBBx5o03PT6IY0ajTlFy+99NJi919ttdUWGCWxMHfddVfR56WpEvMbM2ZMzJgxoxjBASxIqADtkOYNbr311nHttde23Pfb3/62GIqXTogfJq1l8Prrr8fFF1/crvdMoUE6EaY1Fd5+++3s2gEAFif1G2mKwDbbbNOh10nD8tMHI/Nvs2bNank89VLLL798sR7DlltuWQzPb8tUhmbNUyMHDBgQS8oTTzxRfN18881b3Z/WYujWrVvL40BrQgVopzQi4Ze//GXLiIN0AkxrHQwePPhDn/fv//7vscMOOxRrK7RntEI6iaX5i48//nisvvrq8alPfSrOOuusmDRpUof/LgAAzdLIyFdeeSU22GCDDr9WGumwyiqrtNrm/1Am9U977bVXywiCL3zhC3HDDTfE3LlzF/p6zcFEWkchLX594403Fms9rLfeerGk/OMf/4ju3bsvMAo0rVew0korxauvvrrE3guWJUIFaKd0xYUUCtx6660xbdq04uuHTX344GiF1157LS655JJ2vedpp51WLBCZFuL53e9+VyzKmFLzTTfddJGrJQMAtDdUSPr27dvh10qBQZouOv+26667Fo/98Y9/jKeeeqqYVtos/TmFBqnP+aA09aA5mEjTL4477rhiWmhasHFxV3Joj9TfLWrBw7RYd3unsEJX4eoP0E7phLbTTjsVv+SnlYDnzZsXn//859v03JEj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2WVJ1gYAUHl6IwC6snaFCvPmzYuDDz44NthggxgwYMDSqwoAoAbojQDo6to12a579+5F4v7uu+8uvYoAAGqE3giArq7dK/iMGDEiXnrppaVTDQBAjdEbAdCVtTtUOOOMM+K4446LW2+9tViEaOrUqa02AICuRG8EQFfW5jUV0mJD3/zmN+NTn/pUcfszn/lM1NXVtVrpON1OcwsBAJZ1eiMAaEeocNppp8Whhx4ad91119KtCACgBuiNAKAdoUJK25PttttuadYDAFAT9EYA0M41FeYf0gcA0NXpjQDo6to8UiFZd911F3vyfPvttztaEwBATdAbAdDV1bd37mD//v2XXjUAADVEbwRAV9euUGH//fePVVdddelVAwBQQ/RGAHR1bV5TwZxBAID/T28EAO0IFZpXOAYAQG8EAO2a/tDY2OiIAQD8L70RALTzkpIAAAAAzYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkqY9lwLzGpmKrou7d6qLqqnrsmvWsr372VfVj+MuvfyKq7vBfPBVVdul+G5ZdQs2r+r/lqtcHdJ6BK/SKKpv+/tyouol/fDWq7Otbrh5V97mLHowqe/CkT5ZdAktZQ4/ubdpPBwUAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQBahAgAAAJBFqAAAAABkESoAAAAAWYQKAAAAQG2GCq+88koceOCBsdJKK0Xv3r1jgw02iMcee6zssgAASqE3AqCW1Jf55u+8805su+22scMOO8Rvf/vbWGWVVeKFF16IAQMGlFkWAEAp9EYA1JpSQ4Vzzjknhg4dGldeeWXLfWuttVaZJQEAlEZvBECtKXX6wy233BKbb7557LvvvrHqqqvGJptsEpdffvki9581a1ZMnTq11QYAsKzQGwFQa0oNFV566aW4+OKLY5111onf/e53cdhhh8VRRx0VV1999UL3nzBhQvTv379l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ACCLUAEAAADIIlQAAAAAsggVAAAAgCxCBQAAACCLUAEAAADIUh81rKmpqfg6berUskthKZrX+K//z+Tr3q2u7BJq3uy5jVF1Vf//PG/WjKiyxlkzW51boKZ7o2nV7Y1mTp8WVTd1akNU2fRp70fVTe02O6qsoUf3qLrp782JKps2a25U3Yzp/zq3V9W8ivdG89rYG9V0qDBt2r9OSh9ba2jZpQCwjEjnlv79+5ddBnSoN/r4OmuWXQoAXaQ3qmuq4Y9kGhsb49VXX42+fftGXV3HP6GbOnVqDB06NCZPnhz9+vVbIjV2NY5hxzmGHecYdlxXPIbpdJhOmoMHD45u3cwOpDbpjarHMew4x7DjHMOO64rHsKmNvVFNj1RIf7EhQ4Ys8ddN3yRd5RtlaXEMO84x7DjHsOO62jE0QoFapzeqLsew4xzDjnMMO66rHcP+beiNfBQDAAAAZBEqAAAAAFmECvNpaGiIU045pfhKHsew4xzDjnMMO84xBBI/CzrOMew4x7DjHMOOcwxj2VyoEQAAACiPkQoAAABAFqECAAAAkEWoAAAAAGQRKsznxz/+cay55prRq1ev2GqrreKRRx4pu6SaMWHChNhiiy2ib9++seqqq8bee+8dzz33XNll1ayzzz476urq4uijjy67lJrzyiuvxIEHHhgrrbRS9O7dOzbYYIN47LHHyi6rJsybNy9OPvnkWGuttYpj99GPfjTGjx8flt6BrktvlE9vtOTpj/LojTpGf7R4QoX/df3118exxx5brOg5adKk2GijjWLXXXeNN954o+zSasI999wTY8aMiYceeihuv/32mDNnTuyyyy4xY8aMskurOY8++mhceumlseGGG5ZdSs155513Ytttt40ePXrEb3/72/if//mfOPfcc2PAgAFll1YTzjnnnLj44ovjwgsvjGeeeaa4/d3vfjcuuOCCsksDSqA36hi90ZKlP8qjN+o4/dHiufrD/0rpe0qT0zdL0tjYGEOHDo0jjzwyTjzxxLLLqzlvvvlmkcqnE+rIkSPLLqdmTJ8+PTbddNO46KKL4owzzoiNN944zj///LLLqhnp3+rvf//7uO+++8oupSZ9+tOfjtVWWy1+8pOftNz3uc99rkjlf/azn5VaG9D59EZLlt4on/4on96o4/RHi2ekQkTMnj07Hn/88dhpp51a7uvWrVtx+8EHHyy1tlo1ZcqU4uuKK65Ydik1JX2isccee7T6XqTtbrnllth8881j3333LRq3TTbZJC6//PKyy6oZ22yzTdxxxx3x/PPPF7effPLJuP/++2P33XcvuzSgk+mNljy9UT79UT69Ucfpjxavvg37LPPeeuutYq5MSqDml24/++yzpdVVq9InGWmuWxpqNWLEiLLLqRnXXXddMbw0De8jz0svvVQMT0vDdb/97W8Xx/Koo46Knj17xqhRo8ouryY+zZg6dWoMGzYsunfvXvxcPPPMM+OAAw4ouzSgk+mNliy9UT79UcfojTpOf7R4QgWWSpr89NNPFwkebTN58uQYO3ZsMecyLYZFftOW0vizzjqruJ3S+PS9eMkllzhxtsENN9wQ11xzTUycODE+/vGPxx/+8IeiCR48eLDjB9ABeqM8+qOO0xt1nP5o8YQKEbHyyisXqdPrr7/e6v50e+DAgaXVVYuOOOKIuPXWW+Pee++NIUOGlF1OzUhDTNPCV2m+YLOUgqbjmOayzpo1q/ge5cMNGjQohg8f3uq+9ddfP2688cbSaqolxx9/fJHG77///sXttDr0yy+/XKxg7qQJXYveaMnRG+XTH3Wc3qjj9EeLZ02FiGL4z2abbVbMlZk/1Uu3t95661JrqxVpvc900rzpppvizjvvLC65QtvtuOOO8dRTTxXJZ/OWUuU0rCr92QmzbdKw0g9erivNf1tjjTVKq6mWzJw5s5gzPb/0vZd+HgJdi96o4/RGHac/6ji9UcfpjxbPSIX/leYZpaQp/aDacsstixVl0yV/Dj744LJLq5lhfWlI0M0331xcj/m1114r7u/fv3+xMiofLh2zD86xXH755YvrCZt72XbHHHNMsZhOGuK33377FddTv+yyy4qNxdtzzz2LOYKrr756MbzviSeeiPPOOy8OOeSQsksDSqA36hi9UcfpjzpOb9Rx+qM2SJeU5F8uuOCCptVXX72pZ8+eTVtuuWXTQw89VHZJNSN9Ky1su/LKK8surWZtt912TWPHji27jJrzq1/9qmnEiBFNDQ0NTcOGDWu67LLLyi6pZkydOrX4nks/B3v16tW09tprN5100klNs2bNKrs0oCR6o3x6o6VDf9R+eqOO0R8tXl36T1vCBwAAAID5WVMBAAAAyCJUAAAAALIIFQAAAIAsQgUAAAAgi1ABAAAAyCJUAAAAALIIFQAAAIAsQgUAAAAgi1ABljEHHXRQ7L333i23t99++zj66KM7vY6777476urq4t133+309wYAaKY3gqVLqACdeEJLJ5K09ezZMz72sY/F6aefHnPnzl2q7/tf//VfMX78+Dbt62QHAHQWvREsG+rLLgC6kt122y2uvPLKmDVrVvzmN7+JMWPGRI8ePWLcuHGt9ps9e3Zxcl0SVlxxxSXyOgAAS5reCGqfkQrQiRoaGmLgwIGxxhprxGGHHRY77bRT3HLLLS3D8s4888wYPHhwrLfeesX+kydPjv322y9WWGGF4gS41157xV//+teW15s3b14ce+yxxeMrrbRSfOtb34qmpqZW7/nBIX7ppH3CCSfE0KFDi3rSpwI/+clPitfdYYcdin0GDBhQpPKprqSxsTEmTJgQa621VvTu3Ts22mij+MUvftHqfVIjsO666xaPp9eZv04AgIXRG0HtEypAidJJJiXvyR133BHPPfdc3H777XHrrbfGnDlzYtddd42+ffvGfffdF7///e+jT58+RaLf/Jxzzz03rrrqqrjiiivi/vvvj7fffjtuuummD33Pr3zlK3HttdfGj370o3jmmWfi0ksvLV43nUhvvPHGYp9Uxz/+8Y/44Q9/WNxOJ83//M//jEsuuST+9Kc/xTHHHBMHHnhg3HPPPS0n+H322Sf23HPP+MMf/hBf+9rX4sQTT1zKRw8AWNbojaAGNQGdYtSoUU177bVX8efGxsam22+/vamhoaHpuOOOKx5bbbXVmmbNmtWy/09/+tOm9dZbr9i3WXq8d+/eTb/73e+K24MGDWr67ne/2/L4nDlzmoYMGdLyPsl2223XNHbs2OLPzz33XIrqi/demLvuuqt4/J133mm57/33329abrnlmh544IFW+371q19t+uIXv1j8edy4cU3Dhw9v9fgJJ5ywwGsBADTTG8GywZoK0IlSyp6S75S0p2FzX/rSl+LUU08t5g9usMEGreYKPvnkk/Hiiy8Wafz83n///fjzn/8cU6ZMKRLzrbbaquWx+vr62HzzzRcY5tcsJeXdu3eP7bbbrs01pxpmzpwZO++8c6v70ycCm2yySfHnlOrPX0ey9dZbt/k9AICuSW8EtU+oAJ0ozae7+OKLixNkmh+YTnTNll9++Vb7Tp8+PTbbbLO45pprFnidVVZZJXtIYXulOpJf//rX8ZGPfKTVY2neIQBALr0R1D6hAnSidHJMi/+0xaabbhrXX399rLrqqtGvX7+F7jNo0KB4+OGHY+TIkcXtdAmmxx9/vHjuwqTEP30KkOb7pYWQPqj504C0yFGz4cOHFyfIv/3tb4tM8ddff/1iUaX5PfTQQ236ewIAXZfeCGqfhRqhog444IBYeeWVi1WN02JEf/nLX4prJR911FHx97//vdhn7NixcfbZZ8cvf/nLePbZZ+Pwww//0Osor7nmmjFq1Kg45JBDiuc0v+YNN9xQPJ5WXk4rG6ehiG+++WaRxKchhscdd1yxANHVV19dDC+cNGlSXHDBBcXt5NBDD40XXnghjj/++GIho4kTJxaLJAEALCl6I6gmoQJU1HLLLRf33ntvrL766sXqwSnx/upXv1rMG2xO57/5zW/Gl7/85eJkmObppZPcZz/72Q993TTE8POf/3xxkh02bFiMHj06ZsyYUTyWhvCddtppxerEq622WhxxxBHF/ePHj4+TTz65WOk41ZFWWU5D/tJllJJUY1odOZ2M0yWV0krIZ5111lI/RgBA16E3gmqqS6s1ll0EAAAAUHuMVAAAAACyCBUAAACALEIFAAAAIItQAQAAAMgiVAAAAACyCBUAAACALEIFAAAAIItQAQAAAMgiVAAAAACyCBUAAACALEIFAAAAIItQAQAAAIgc/w/EC0EfZkl/fgAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 5
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  },
  "kernelspec": {
   "name": "python3",
   "language": "python",
   "display_name": "Python 3 (ipykernel)"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
